//////////////////////////////////////////////////////////////////////////

#ifndef _ACCEPTOR_H_
#define _ACCEPTOR_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _IACCEPTOR_H_
#include "iacceptor.h"
#endif

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

#ifndef _UDPSERVER_H_
#include "udpserver.h"
#endif

//////////////////////////////////////////////////////////////////////////



/** Acceptor class. It accepts incoming TCP connections from clients 
*   and notifies observers about that.
*   Socket of accepted connection can be obtained by calling GetTCPSocket()
*
*   Acceptor also has an instance of UDP server for establishing UDP
*   connection right after TCP has been established.
*  
*
*  @author   Pasechnik Roman
*  @since    Nov 27th, 2009
*  @updated  Jan 19th, 2010
*/
class Acceptor : public IAcceptor
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Constructor */
    Acceptor( int _port );


    /** Destructor */
    virtual ~Acceptor();


//////////////////////////////////////////////////////////////////////////


    /** Starts accepting */
    virtual void Start();


//////////////////////////////////////////////////////////////////////////


    /** Gets freshly-accepted client socket */
    const TCPSocketPtr& GetTCPSocket() const;


    /** Gets UDP Server */
    UDPServer& GetUDPServer();


//////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Accept handler */
    void HandleAccept( const boost::system::error_code& _error );


//////////////////////////////////////////////////////////////////////////


    /** TCP acceptor */
    boost::asio::ip::tcp::acceptor m_Acceptor;


    /** Socket */
    TCPSocketPtr m_Socket;


    /** UPD server */
    UDPServer m_UDPServer;


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
